﻿using LianChuDemo.IDal.BaseInfoManagerDal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WenDangOne.Common.Lib.TypeTools;
using WenDangOne.DbModel.BaseInfoManager;
using WenDangOne.ViewModel.BaseInfoManagerView;

namespace LianChuDemo.Bll.BaseInfoManagerBll
{
    public class WebSystemMenuBll
    {
        private IWebSystemMenuDal _webSystemMenuDal;
        public WebSystemMenuBll(IWebSystemMenuDal webSystemMenuDal)
        {
            _webSystemMenuDal = webSystemMenuDal;
        }

        /// <summary>
        /// 获取所有模块,调用dal层的方法，，获取到所有的模块
        /// </summary>
        /// <returns></returns>
        public List<WebSystemMenu> GetWebSystemMenuAll()
        {
            return _webSystemMenuDal.GetWebSystemMenuAll();
        }
        /// <summary>
        /// 从数据库获取所有的模块, 并且初始化为层级模块，这个要自己实现
        /// </summary>
        /// <returns></returns>
        public List<WebSystemMenuView> GetWebSystemMenuViewsAll()
        {
            //定义一个数值
            List<WebSystemMenu> wsmDbs = GetWebSystemMenuAll();
            //实力化
            List<WebSystemMenuView> viewsAll = new List<WebSystemMenuView>();
            ///获取最顶级的列表，1是为最高的，就是排序最高的数字，所以1是顶级
            List<WebSystemMenu> oneModel = wsmDbs.Where(c => c.wm_level == 1).ToList();

            foreach (var item in oneModel)
            {
                //对子模块进行子模块的子模块列表递归初始化
                WebSystemMenuView oneView = IniViewModel(item, wsmDbs);
                viewsAll.Add(oneView);
            }
            return viewsAll;
        }
        /// <summary>
        /// 对指定模块进行初始化和递归初始化模块子列表, 并返回初始化好的View
        /// </summary>
        /// <param name="db">指定模块</param>
        /// <param name="wsmDbs">所有模块列表</param>
        /// <returns></returns>
        public WebSystemMenuView IniViewModel(WebSystemMenu db, List<WebSystemMenu> wsmDbs)
        {
            //对model之间的数据进行复制，就是将这里的值赋给新建的值里头
            WebSystemMenuView view = ModelCopier.CreateInstanceFrom<WebSystemMenuView>(db);
            //搜索指定菜单的所有的子列表
            List<WebSystemMenu> sonList = wsmDbs.Where(c => c.wm_parent_code == view.wm_code).ToList();
            //循环子列表
            if (sonList != null && sonList.Count > 0)
            {
                view.SonWebSystemMenuViewList = new List<WebSystemMenuView>();
                foreach (var s in sonList)
                {
                    //对子模块进行子模块的子模块列表递归初始化，查到最小的值
                    WebSystemMenuView son = IniViewModel(s, wsmDbs);
                    view.SonWebSystemMenuViewList.Add(son);
                }
            }

            return view;

        }
        /// <summary>
        /// 验证方法 
        /// </summary>
        /// <param name="wsmCode"></param>
        /// <returns></returns>
        public bool VMenuCode(string wsmCode)
        {
            if (_webSystemMenuDal.GetWebSystemMenuByCode(wsmCode) == null) return true;
            return false;
        }

        public bool MenuAdd(WebSystemMenu wsmDb)
        {
            return _webSystemMenuDal.WebSystemMenuAdd(wsmDb);
        }



        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="wsm"></param>
        /// <returns></returns>
        public bool WebSystemMenuUpdate(WebSystemMenu wsm)
        {
            return _webSystemMenuDal.WebSystemMenuUpdate(wsm);
        }

        /// <summary>
        /// 获取父菜单的名称
        /// </summary>
        /// <param name="wMCode"></param>
        /// <returns></returns>
        public WebSystemMenuView GetWebSystemMenuViewByCode(string wMCode)
        {
            return _webSystemMenuDal.GetWebSystemMenuViewByCode(wMCode);
        }

        /// <summary>
        /// 根据用户获取层级网页系统菜单
        /// </summary>
        /// <returns></returns>
        public List<WebSystemMenuView> GetUserWebSystemMenu()
        {
            //获取token，我们根据获取的token去获取他的登录人的姓名
            LoginUser user = AdminUserBll.GetLoginUser();
            if (user == null) return null;
            //这波啊，这波是根据用token获取的用户名，在调用dal层的根据名字查询数据的方法查出数据。
            List<WebSystemMenu> dbMenu = _webSystemMenuDal.GetWebSystemMenusUserName(user.user_name);
            //对他进行一个非空的验证
            if (dbMenu == null || dbMenu.Count == 0) return null;
            //实例
            List<WebSystemMenuView> viewsAll = new List<WebSystemMenuView>();
            //获取最顶级的列表
            List<WebSystemMenu> oneModels = dbMenu.Where(c => c.wm_level == 1).ToList();

            foreach (var item in oneModels)
            {
                //对子模块进行子模块的子模块列表递归初始化
                //人话就是查询顶级的、就是父级下面的子列表
                WebSystemMenuView oneView = IniViewModel(item, dbMenu);
                viewsAll.Add(oneView);
            }
            return viewsAll;
        }
    }
}
